package day0401;

import java.util.*;


public class Dynamic27 {
    /**
     * 27.高效的任务规划
     * 你有 n 台机器，编号为 1~n，每台都需要完成一项工作，机器经过配置后都能完成独 立完成一项工作。
     * 假设第 i 台机器你需要花 B 分钟进行设置，然后开始运行，J 分钟后完成任务。
     * 现在，你需要选择布置工作的顺序，使得用最短的时间完成所有工作。
     * 注意，不能同时对两台进行配置，但配置完成的机器们可以同时执行他们各自的工作.
     * <p>
     * 输入描述
     * <p>
     * 第一行输入代表总共有 M 组任务数据 (1<M<=10)。 。每组数第一行为一个整数指定机器的数量 N
     * (0<N<=1000)。 随后的 N 行每行两个整数，第一个表示 B (0<=B<=10000)，第二个表示 J
     * (0<=J<=10000)
     * <p>
     * 每组数据连续输入，不会用空行分隔。各组任务单独计时。
     * <p>
     * 输出描述
     * <p>
     * 对于每组任务，输出最短完成时间，且每组的结果独占一行。例如，两组任务就应该有
     * <p>
     * 两行输出
     */

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());//n组
        for (int i = 0; i < n; i++) {
            int machineNum = Integer.parseInt(sc.nextLine());// 机器
            int[][] arr = new int[machineNum][2]; // 组装 配置和运行时间
            for (int j = 0; j < machineNum; j++) {
                String[] s = sc.nextLine().split(" ");
                arr[j][0] = Integer.parseInt(s[0]);
                arr[j][1] = Integer.parseInt(s[1]);
            }
            // 对运行时间降序排序
            Arrays.sort(arr, (o1, o2) -> Integer.compare(o2[1], o1[1]));
            int[] dp = new int[machineNum];
            dp[0] = arr[0][0] + arr[0][1];
            for (int j = 1; j < machineNum; j++) {
                dp[j] = Math.max(dp[j - 1], dp[j - 1] + arr[j][0] + arr[j][1] - arr[j - 1][1]);
            }
            System.out.println(dp[machineNum - 1]);

        }
    }

}

